package gui;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;

import utility.Time;
import business.AnneeEtudeBL;
import business.EnseignantBL;
import business.PeriodeBL;
import business.SalleBL;
import business.SeanceBL;
import business.SeanceSpecialeBL;

public class SemaineSalleUI extends SemaineUI {

	private int idSalle;

	public SemaineSalleUI(Date debutSemaine, int matin, int aprem, int idSalle) {
		super(debutSemaine, matin, aprem);
		this.idSalle = idSalle;
		load();
	}

	public String toString() {
		return "22/02 - 26/02";
	}

	private class PeriodePopup extends JPopupMenu implements ActionListener {
		private JMenuItem ajouter = new JMenuItem("Ajouter");

		private int idPeriode;

		public PeriodePopup(int idPeriode) {
			this.idPeriode = idPeriode;
			ajouter.addActionListener(this);
			add(ajouter);
		}

		public void actionPerformed(ActionEvent e) {
			if (e.getSource() == ajouter) {
				FrameAjoutSeanceSpeciale frameAjout = new FrameAjoutSeanceSpeciale(
						-1, idSalle, idPeriode);
				frameAjout.setVisible(true);
			}

		}
	}

	@Override
	public void load() {

		// methode pour recuperer toutes les semaines avec semaine actuelle
		int nbJours = 5;
		int nbPeriodes = 3 + 3;

		String[] jours = new String[nbJours];

		Calendar c = Calendar.getInstance();
		c.set(debutSemaine.getYear(), debutSemaine.getMonth(), debutSemaine
				.getDate());

		for (int i = 0; i < nbJours; i++) {
			jours[i] = c.get(Calendar.DATE) + "/" + (c.get(Calendar.MONTH) + 1);
			c.add(Calendar.DATE, 1);
		}

		setLayout(new BorderLayout());

		JPanel entete = new JPanel();
		add(entete, BorderLayout.PAGE_START);
		GridLayout enteteLayout = new GridLayout(1, 6);
		enteteLayout.setHgap(10);
		entete.setLayout(enteteLayout);

		entete.add(new JLabel());
		entete.add(new IntituleJourUI("Lundi " + jours[0]));
		entete.add(new IntituleJourUI("Mardi " + jours[1]));
		entete.add(new IntituleJourUI("Mercredi " + jours[2]));
		entete.add(new IntituleJourUI("Jeudi " + jours[3]));
		entete.add(new IntituleJourUI("Vendredi " + jours[4]));

		JPanel contenu = new JPanel();
		add(contenu, BorderLayout.CENTER);
		GridLayout contenuLayout = new GridLayout(3 + 3, 6);
		contenuLayout.setHgap(10);
		contenu.setLayout(contenuLayout);

		SalleBL salleBL = new SalleBL(idSalle);
		PeriodeBL periodeBL = new PeriodeBL();

		String[] intitules = { "8h00 - 9h30", "9h45 - 11h15", "11h30 - 13h00",
				"14h00 - 15h30", "15h45 - 17h15", "17h30 - 19h00" };

		for (int periodeCourante = 0; periodeCourante < nbPeriodes; periodeCourante++) {
			contenu.add(new IntitulePeriodeUI(intitules[periodeCourante]));
			/* Reinitialiser le calendrier au debut de la semaine */
			c.set(debutSemaine.getYear(), debutSemaine.getMonth(), debutSemaine
					.getDate());
			for (int jourCourant = 0; jourCourant < nbJours; jourCourant++) {
				String dateString = Time.dateToString(new Date(c
						.get(Calendar.YEAR), c.get(Calendar.MONTH), c
						.get(Calendar.DATE)));

				int idPeriode = periodeBL.getIdPeriode(dateString,
						periodeCourante);
				PeriodeUI periode = new PeriodeUI(this, idPeriode,
						new PeriodePopup(idPeriode));

				ArrayList<SeanceBL> seanceList = salleBL
						.getListeSeances(idPeriode);
				for (SeanceBL seanceBL : seanceList) {
					periode.add(new SeanceUI(periode, seanceBL.getId(),
							seanceBL.getCouleur(), seanceBL.getNom(), "TD",
							seanceBL.getNomProf(), seanceBL.getNomAnneeEtude(),
							seanceBL.getNomGroupe(), seanceBL.getNomSalle()));
				}

				ArrayList<SeanceSpecialeBL> seanceSpecialeList = salleBL
						.getListeSeancesSpeciale(idPeriode);
				for (SeanceSpecialeBL seanceSpecialeBL : seanceSpecialeList) {
					periode.add(new SeanceSpecialeUI(seanceSpecialeBL.getId(),
							seanceSpecialeBL.getCouleur(), seanceSpecialeBL
									.getNom(), seanceSpecialeBL.getNomSalle()));
				}

				contenu.add(periode);

				c.add(Calendar.DATE, 1);
			}
		}

	}

}
